Skip to content

Instantly share code, notes, and snippets.

@russelldb
Last active June 28, 2016 17:25
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save russelldb/c10f8564e8e7ebe6576b9f088f5dc481 to your computer and use it in GitHub Desktop.
Save russelldb/c10f8564e8e7ebe6576b9f088f5dc481 to your computer and use it in GitHub Desktop.

Instructions pre-lecture

  • download box (warning, it is 1.1gb so start this first!) curl -o riak-2.1.4-devrel.box https://s3-eu-west-1.amazonaws.com/riak-lecture/vagrant/riak-2.1.4-devrel.box

  • install virtualbox - https://www.virtualbox.org/wiki/Downloads

  • install vagrant - https://www.vagrantup.com/downloads.html

  • run vagrant box add riak-devrel riak-2.1.4-devrel.box (the box you downloaded in step 1)

  • create a folder (mkdir riak-lecture)

  • cd riak-lecture

  • vagrant init riak-devrel to prepare the box

  • vagrant up to start the box

  • vagrant ssh to shell into the box

  • cd lecture/riak

  • ./setup-dev will build a 4-node dev cluster of riak

  • send me the output if it is does not contain this

      Cluster changes committed
      started, pinged, clustered
      sets created
    
  • exit

  • run vagrant suspend

  • see you on Wednesday!

# -*- mode: ruby -*-
# vi: set ft=ruby :
# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure(2) do |config|
# The most common configuration options are documented and commented below.
# For a complete reference, please see the online documentation at
# https://docs.vagrantup.com.
# Every Vagrant development environment requires a box. You can search for
# boxes at https://atlas.hashicorp.com/search.
config.vm.box = "riak-devrel"
# Disable automatic box update checking. If you disable this, then
# boxes will only be checked for updates when the user runs
# `vagrant box outdated`. This is not recommended.
# config.vm.box_check_update = false
# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine. In the example below,
# accessing "localhost:8080" will access port 80 on the guest machine.
# config.vm.network "forwarded_port", guest: 80, host: 8080
# Create a private network, which allows host-only access to the machine
# using a specific IP.
# config.vm.network "private_network", ip: "192.168.33.10"
# Create a public network, which generally matched to bridged network.
# Bridged networks make the machine appear as another physical device on
# your network.
# config.vm.network "public_network"
# Share an additional folder to the guest VM. The first argument is
# the path on the host to the actual folder. The second argument is
# the path on the guest to mount the folder. And the optional third
# argument is a set of non-required options.
# config.vm.synced_folder "../data", "/vagrant_data"
# Provider-specific configuration so you can fine-tune various
# backing providers for Vagrant. These expose provider-specific options.
# Example for VirtualBox:
#
config.vm.provider "virtualbox" do |vb|
# # Display the VirtualBox GUI when booting the machine
# vb.gui = true
#
# # Customize the amount of memory on the VM:
# vb.memory = "1024"
vb.customize ["modifyvm", :id, "--ioapic", "on"]
vb.customize ["modifyvm", :id, "--memory", "4096"]
vb.customize ["modifyvm", :id, "--cpus", "2"]
end
#
# View the documentation for the provider you are using for more
# information on available options.
# Define a Vagrant Push strategy for pushing to Atlas. Other push strategies
# such as FTP and Heroku are also available. See the documentation at
# https://docs.vagrantup.com/v2/push/atlas.html for more information.
# config.push.define "atlas" do |push|
# push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME"
# end
# Enable provisioning with a shell script. Additional provisioners such as
# Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
# documentation for more information about their specific syntax and use.
# config.vm.provision "shell", inline: <<-SHELL
# sudo apt-get update
# sudo apt-get install -y apache2
# SHELL
end

start

vagrant up
vagrant ssh
cd lecture/riak/

./ping-em

dev/dev1/bin/riak-admin member-status

Create a Bucket

dev/dev1/bin/riak-admin bucket-type list
dev/dev1/bin/riak-admin bucket-type create lecture
dev/dev1/bin/riak-admin bucket-type activate lecture
dev/dev1/bin/riak-admin bucket-type list

Check Bucket Properties

curl -X GET localhost:10018/types/lecture/buckets/test/props | python -mjson.tool

Add data

curl -X GET localhost:10018/types/lecture/buckets/test/keys/foo

curl  -X PUT localhost:10018/types/lecture/buckets/test/keys/foo -d"hello, riak!"
curl -X GET localhost:10018/types/lecture/buckets/test/keys/foo

curl -v -X GET localhost:10018/types/lecture/buckets/test/keys/foo

Use the Vclock

curl  -X PUT localhost:10018/types/lecture/buckets/test/keys/foo -d"hola, riak!" \
    -H "X-Riak-Vclock: a85hYGBgzGDKBVI8R4M2cnss/6EGEUpkzGNlqBBbdoEvCwA="

No vclock?

curl  -X PUT localhost:10018/types/lecture/buckets/test/keys/foo -d"yo, riak!"

curl -v -X GET localhost:10018/types/lecture/buckets/test/keys/foo

Fetch siblings

curl -v -X GET localhost:10018/types/lecture/buckets/test/keys/foo \
    -H "Accept: multipart/mixed"

resolved conflict

curl  -X PUT localhost:10018/types/lecture/buckets/test/keys/foo \
    -d"buongiorno, riak!" \
        -H "X-Riak-Vclock: a85hYGBgzGDKBVI8R4M2cnss/6EGEUpkzmNleCy+7AJfFgA="

curl -X GET localhost:10018/types/lecture/buckets/test/keys/foo

Consistency vs availability

./partitioner -p

curl  -X PUT localhost:10018/types/lecture/buckets/test/keys/bar?pw=2 -d"baz"
curl  -X PUT localhost:10048/types/lecture/buckets/test/keys/bar?pw=2 -d"baz"

curl  -X PUT localhost:10018/types/lecture/buckets/test/keys/bar -d"beep"

./partitioner -j

curl  -X GET localhost:10028/types/lecture/buckets/test/keys/bar

CRDTs part 1 DIY

curl  -X GET localhost:10028/types/lecture/buckets/test/keys/friends
curl -X PUT localhost:10028/types/lecture/buckets/test/keys/friends -d"[bob]"
curl -v  -X GET localhost:10028/types/lecture/buckets/test/keys/friends
curl -X PUT localhost:10028/types/lecture/buckets/test/keys/friends -d"[bob,sue]" \
    -H "X-Riak-Vclock: a85hYGBgzGDKBVI8c+04TvmhBIZ81gZqmWXXeDLAgA="

curl -X PUT localhost:10028/types/lecture/buckets/test/keys/friends -d"[bob,rita]" \
    -H "X-Riak-Vclock: a85hYGBgzGDKBVI8c+04TvmqchtDhBIZ81gZqmWXXeDLAgA="
    
curl -v -X GET localhost:10018/types/lecture/buckets/test/keys/friends \
    -H "Accept: multipart/mixed"

curl -X PUT localhost:10028/types/lecture/buckets/test/keys/friends \
    -d"[bob,rita,sue]" \
    -H "X-Riak-Vclock: a85hYGBgymDKBVI8W1hlPX0jzCwgQomMeawM+2WXXeCDSs+14zjlq8ptDGQzAqWZgNImckDpLAA="

curl -X GET localhost:10018/types/lecture/buckets/test/keys/friends

CRDTs part2 removes?

curl -X PUT localhost:10028/types/lecture/buckets/test/keys/friends \
    -d"[adam,vera]" \
    -H "X-Riak-Vclock: a85hYGBgzGDKBVI8c+04TvmqchtDhBIZ81gZqmWXXeDLAgA="

curl -v -X GET localhost:10018/types/lecture/buckets/test/keys/friends \
-H "Accept: multipart/mixed"

More presentation

CRDTs now you know why!

Riak Data Types Sets

 curl -X GET localhost:10018/types/sets/buckets/test/datatypes/friends \
    | python -mjson.tool
    
curl -X POST localhost:10018/types/sets/buckets/test/datatypes/friends \
-H"content-type: application/json" -d'{"add":"bob"}'

curl -X GET localhost:10018/types/sets/buckets/test/datatypes/friends \
    | python -mjson.tool
    
curl -X POST localhost:10018/types/sets/buckets/test/datatypes/friends \
-H"content-type: application/json" -d'{"add_all": ["rita", "sue"]}'

./partitioner -p

curl -X POST localhost:10018/types/sets/buckets/test/datatypes/friends \
    -H"content-type: application/json" -d'
    {"remove":"bob", "context":"

curl -X GET localhost:10018/types/sets/buckets/test/datatypes/friends \
    | python -mjson.tool

curl -X POST localhost:10048/types/sets/buckets/test/datatypes/friends \
    -H"content-type: application/json" -d'{"add_all": ["adam", "vera"]}'
    
curl -X GET localhost:10048/types/sets/buckets/test/datatypes/friends \
    | python -mjson.tool
    
./partitioner -j

curl -X GET localhost:10018/types/sets/buckets/test/datatypes/friends \
| python -mjson.tool
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment